//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#include "dictionnaire.h"
//#include "compression.h"
//#include "decompression.h"
////#include "hach.h"
//
//
//int main(int argc, char** argv) {
//    
//    char *a_compresser = "fichier_a_compresser";
//    char *compresse = "fichier_compresse.lwz";
//    char *decompresse = "fichier_decompresse.bmp";
//    
//    
//   /*
//    if(argc != 3){
//        printf("USAGE: %s <mode = -d / -c> <FileName>", argv[0]);
//        return ARGUMENT_ERROR;
//    }
//    else{
//         if (strcmp(argv[1], "-d") == 0){
//            printf("******* Decompression *******");
//            return decompresser();
//        }else if(strcmp(argv[1], "-c") == 0){
//            printf("******* Compression *******");
//            return compresser();
//        }else{
//            perror("Mode incorrect : <mode = -d / -c>");
//            return ARGUMENT_ERROR;
//        }
//    }
//    */
//    //Initialiser();
//    //AfficherDictionnaire();
//    
//    printf("***********************\n");
//    printf("Compression: Start\n");
//    
//    Compresser(a_compresser,compresse);
//    
//    printf("Compression: End\n");
//    printf("***********************\n");
//    printf("Decompression: Start\n");
//    
//    Decompresser(compresse, decompresse);
//    
//    
//    printf("Decompression: End\n");
//    printf("***********************\n");
//    
//   // AfficherDictionnaire();
//    
//    
//    //tests pour le getCode
////    open_in("unfichier_in"); 
////    unsigned long int res =  getCode(4); //1
////    printf("res = %X \n",res);
////    res =  getCode(8); //23
////    printf("res = %X \n",res);
////    res =  getCode(12); //456
////    printf("res = %X \n",res);
////    res =  getCode(8); //78
////    printf("res = %X \n",res);
////    res =  getCode(4); //9
////    printf("res = %X \n",res);
////    res =  getCode(4); //A
////    printf("res = %X \n",res);
////    res =  getCode(1); //1
////    printf("res = %X \n",res);
////    res =  getCode(1); //0
////    printf("res = %X \n",res);
////    res =  getCode(1); //1
////    printf("res = %X \n",res);
////    res =  getCode(1); //1
////    printf("res = %X \n",res);
//    
//    //tests pour le putCode
////    open_out("unfichier_out");
////    putCode(0x1,4);
////    putCode(0x23,8);
////    putCode(0x456,12);
////    putCode(0x789,12);
////    putCode(0xAB,8);
////    putCode(0xC,4);
////    putCode(0xD,4);
////    close_out();
//  
//    return NO_ERROR; 
//}
//
//

/**
 * \file main.c
 * \brief Programme principal
 * \author clmdm
 * 
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "arguments.h"
#include "decompression.h"
#include "compression.h"


int isLZW(const char * inputFilename){
  
   int fileisPPM = 0;
 
   if ( inputFilename != NULL ){
      
      char * p = strrchr (inputFilename, '.');
     
      if (p != NULL) {
        
          if (strcmp (++p, "LZW") == 0){
            
              fileisPPM = 1;
      
          }
     
      }
   }
 
   return fileisPPM;
}



void printTitle(void){
    
    printf(" _      _______    _   _____ ________  _______________ _____ _____ _____\n");
    printf("| |    |___  / |  | | /  __ \\  _  |  \\/  || ___ \\ ___ \\  ___/  ___/  ___|\n");
    printf("| |       / /| |  | | | /  \\/ | | | .  . || |_/ / |_/ / |__ \\ `--.\\ `--. \n");
    printf("| |      / / | |/\\| | | |   | | | | |\\/| ||  __/|    /|  __| `--. \\`--. \\ \n");
    printf("| |____./ /__\\  /\\  / | \\__/\\ \\_/ / |  | || |   | |\\ \\| |___/\\__/ /\\__/ / \n");
    printf("\\_____/\\_____/\\/  \\/   \\____/\\___/\\_|  |_/\\_|   \\_| \\_\\____/\\____/\\____/ ");
    printf("\n\n");
 
   
}

void printMan(void){
        printf("Ce programme a ete cree dans le but de compresser et decompresser des fichiers avec l'alogirthme de Lempel-Ziv-Welch\n\n");
        printf("Le programme prend 2 parametres:");
        printf("\n  2 parametres : \n");
        printf("\t ./traitement_image -c fichier_a_compresser \n\n");
        printf("\t ./traitement_image -d fichier_a_decompresser.LZW \n");
        printf("\n\tNota bene : le fichier est sauvegarde dans le dossier du programme.");
        printf("\n\n");
}


int main(int argc,char** argv) {

    char *inputFileName ;
    char *outputFileName = malloc(sizeof(char)*strlen(argv[2])+5);
    int ext_isLZW = 0,/* 1 si le fichier d'entree à bien l'extension PPM, 0 Sinon */
        compress = 0, /* compress = 1 pour compresser, 0 pour decompresser */
        correctArgsNumb = 1,
        test =0;
    
    /*********************************/
    /* Verification des parametres **/
    /********************************/
   
    switch (argc) {
        case 3: /* cas ou le nom du fichier de sortie n'est pas precise */
            
            if ( ( strcmp(argv[1], "-c") == 0 ) || ( strcmp(argv[1], "-d") == 0 ) || ( strcmp(argv[1], "-test") )  ){
                
                if ( strcmp(argv[1], "-c") == 0 ){
                    compress = 1;
                    
                    inputFileName = argv[2];
                    strcpy(outputFileName,argv[2]);
                    strcat(outputFileName,".LZW");
                    test =0;       
                    correctArgsNumb = 1;
                }
                else if ( strcmp(argv[1], "-d") == 0 ) {
                    
                    compress = 0;
                    
                    ext_isLZW = isLZW(argv[2]);
                    
                    if ( ext_isLZW ){
                        
                     inputFileName =argv[2];
                     outputFileName = "fichier_decompresse";
                     test=0;
                     correctArgsNumb = 1;
                        
                    }
                   
                    else if (!ext_isLZW ){
                        
                        correctArgsNumb = 0;
                        
                    }       
                          
                    
                }
                else if ( strcmp(argv[1], "-test") == 0 ){
                    correctArgsNumb = 1;
                    test=1;
                }
            
            }
            
            else {
               correctArgsNumb = 0;
            }
            break;
        default:
            correctArgsNumb = 0; /* S'il n'y as pas deux parametres */
    }                           
    
    /********************************************************/
    /* Paramètres incorrects, avertissement à l'utilsateur */
    /******************************************************/
    if ( !correctArgsNumb ) {
        printTitle();
        printMan();
        printf("\n%s",argv[1]);
    
    }
    /****************************/
    /*** Paramètres corrects ****/       
    /****************************/
    else if ( correctArgsNumb ) {
        
        float taux;
        
        printTitle(); /* Affiche le titre sur la sortie standard */
        
        if (!test){


            if (compress == 1){ /*ici on compresse */ 
                printf("DEBUT COMPRESSION \n");
                Compresser(inputFileName,outputFileName);
                printf("FIN COMPRESSION \n");

                taux = ((float)tailleOutFile) / ((float)tailleInFile);
                taux = taux *100.0;

                printf("[TIME] %f sec\n",temps_compression);
                printf("[TAUX] %.2f %% \n",taux);
            }
            else{/*on decompresse ici*/
                printf("DEBUT DECOMPRESSION \n");

                Decompresser(inputFileName,outputFileName);
                printf("FIN DECOMPRESSION \n");
                printf("[TIME] %f sec\n",temps_decompression);
            }
            
        }
        else {
            
            
            printf("test\n");
            // WILLIAM TES TESTS TU LES METS LA.
        }
    }    

    return 0;
}


